package top.hekun.study.reptile.util;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

import top.hekun.study.reptile.model.ByteBufferProxy;

/**
 * 爬虫工具
 * @Author: 贺坤
 * @Date: 2023/4/23 14:51
 */
public class ReptileUtil {


    /**
     * 小说爬虫
     * 不具有通用性 只能扒 指定网站的小说, 其余网站需要更改代码,
     *
     * @param filePath 文件存放路径
     * @param name     文件名称
     * @param url      爬虫地址
     * @param num      爬取章节数  倒数多少章, 为 null 扒所有
     *
     * @throws IOException
     */
    public static void  novelReptile(File filePath, String name, String url, Integer num) throws IOException {

        File file = new File(filePath, name);
        // Java7的新特性。 自动释放 try () () 内资源
        try (
                //文件内容追加模式--推荐
                FileOutputStream outputStream = new FileOutputStream(file, true);
                // 获取通道
                FileChannel channel = outputStream.getChannel()
        ) {
            // 获取页面信息
            Document document = JsoupUtil.getDocumentByUrl(url);
            // url 缓存, 存储章节的具体url
            List<String> urlList = new ArrayList<>();
            // 处理章节URL地址 根据页面元素判断,先根据id取list 然后在获取A标签
            Elements postItems = document.getElementById("list").getElementsByTag("a");
            for (int i = num == null ? 0 : (postItems.size() - num); i < postItems.size(); i++) {
                // 获取A标签内的值,然后根据规则与小说地址拼接
                String attr = postItems.get(i).attr("href");
                String href = url + attr;
                urlList.add(href);
            }
            // 设置nio的缓冲区
            ByteBufferProxy byteBufferProxy = ByteBufferUtil.getByteBufferProxy(1000000);
            byteBufferProxy.flip();//写出模式
            // 遍历所有需要下载的小说章节
            for (String chapterUrl : urlList) {
                // 获取页面内容
                Document chapterDocument = JsoupUtil.getDocumentByUrl(chapterUrl);
                // 获取章节 名称
                String chapterName = chapterDocument.getElementsByClass("bookname").get(0).getElementsByTag("h1").text();
                System.out.println("即将处理" + chapterName + " 章");
                // 获取文本内容
                Element content = chapterDocument.getElementById("content");
                // 换行处理,方便阅读
                String text = content.text().replace(" ", "\r\n");
                // 写入,并且插入换行
                byteBufferProxy
                        .compact()
                        .write(chapterName)
                        .write("\r\n")
                        .write("\r\n")
                        .write(text)
                        .write("\r\n")
                        .write("\r\n")
                        .writeChannel(channel)
                ;
            }
        }

    }
}
